package Leetcode.DayTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: kirito
 * @Date: 2024/5/21 12:00
 * @Description:
 * 给你两个整数 num 和 t 。
 *
 * 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等，则称其为 可达成数字 ：
 *
 * 每次操作将 x 的值增加或减少 1 ，同时可以选择将 num 的值增加或减少 1 。
 * 返回所有可达成数字中的最大值。可以证明至少存在一个可达成数字。
 *
 *
 *
 * 示例 1：
 *
 * 输入：num = 4, t = 1
 * 输出：6
 * 解释：最大可达成数字是 x = 6 ，执行下述操作可以使其等于 num ：
 * - x 减少 1 ，同时 num 增加 1 。此时，x = 5 且 num = 5 。
 * 可以证明不存在大于 6 的可达成数字。
 * 示例 2：
 *
 * 输入：num = 3, t = 2
 * 输出：7
 * 解释：最大的可达成数字是 x = 7 ，执行下述操作可以使其等于 num ：
 * - x 减少 1 ，同时 num 增加 1 。此时，x = 6 且 num = 4 。
 * - x 减少 1 ，同时 num 增加 1 。此时，x = 5 且 num = 5 。
 * 可以证明不存在大于 7 的可达成数字。
 *
 *
 * 提示：
 *
 * 1 <= num, t <= 50
 */

public class theMaximumAchievableX {
    public int theMaximumAchievableX(int num, int t) {
        return num + t * 2;
    }

    /**
     * 给你一个长度为 n 的字符串 word 和一个整数 k ，其中 k 是 n 的因数。
     *
     * 在一次操作中，你可以选择任意两个下标 i 和 j，其中 0 <= i, j < n ，
     * 且这两个下标都可以被 k 整除，然后用从 j 开始的长度为 k 的子串替换从 i 开始的长度为 k 的子串。
     * 也就是说，将子串 word[i..i + k - 1] 替换为子串 word[j..j + k - 1] 。
     *
     * 返回使 word 成为 K 周期字符串 所需的 最少 操作次数。
     *
     * 如果存在某个长度为 k 的字符串 s，使得 word 可以表示为任意次数连接 s ，则称字符串 word 是 K 周期字符串 。
     * 例如，如果 word == "ababab"，那么 word 就是 s = "ab" 时的 2 周期字符串 。
     *
     * 示例 1：
     *
     * 输入：word = "leetcodeleet", k = 4
     *
     * 输出：1
     * 解释：可以选择 i = 4 和 j = 0 获得一个 4 周期字符串。这次操作后，word 变为 "leetleetleet" 。
     * @param word  字符串
     * @param k 周期
     * @return  最少操作次数
     */
    public static int minimumOperationsToMakeKPeriodic(String word, int k) {
        int max = 0;
        int n = word.length();
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i <= n-k; i+= k) {
            String str = word.substring(i, i + k);
            int count = map.merge(str, 1, Integer::sum);
            max = Math.max(count, max);
        }
        return n / k - max;
    }

    public static void main(String[] args) {
        String s = "leetcoleet";
        int num = 2;
        System.out.println(minimumOperationsToMakeKPeriodic(s, num));
    }
}
